﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using upcdew_20111_group2b.CapaPersistencia;
using upcdew_20111_group2b.CapaDominio;

namespace upcdew_20111_group2b.CapaNegocio
{
    public class AdminCondominio
    {
        // Dependencias
        ResidenteDAO ResidenteDAO { get; set; }
        ViviendaDAO ViviendaDAO { get; set; }
        Cuota_PagoDAO Cuota_PagoDAO { get; set; }
        Area_ComunDAO Area_ComunDAO { get; set; }

        // Servicios básicos
        public Residente CrearResidente(Residente residente)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            if (residente.CodResidente == null)
                throw new Exception("Debe registrar el código de residente");
            if (residente.Nom_Residente == null)
                throw new Exception("Debe registrar el nombre del residente");
            if (residente.Tex_Tipo_Residente == null)
                throw new Exception("Debe registrar el tipo de residente");
            Residente existeResidente = ResidenteDAO.Obtener(residente.CodResidente);
            if (existeResidente != null)
                throw new Exception("El código " + residente.CodResidente + "ya existe");
            //ICollection<Residente> existeCorreo = ResidenteDAO.ListarXCorreo(residente.Tex_Correo);
            //if (existeCorreo != null)
            //    throw new Exception("El correo " + residente.Tex_Correo + "ya existe");                        

            return ResidenteDAO.Crear(residente);
        }
        public Residente ObtenerResidente(String codresidente)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ResidenteDAO.Obtener(codresidente);
        }
        public Residente ModificarResidente(Residente residente)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ResidenteDAO.Modificar(residente);
        }
        public void EliminarResidente(Residente residente)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            ResidenteDAO.Eliminar(residente);
        }

        public ICollection<Residente> ListarTodosLosResidentes()
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ResidenteDAO.ListarTodosLosResidentes();
        }

        public Vivienda CrearVivienda(Vivienda vivienda)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            if (vivienda.CodVivienda == null)
                throw new Exception("La vivienda " + vivienda.CodVivienda + " no existe.");
            if (vivienda.CodResidente == null)
                throw new Exception("El residente " + vivienda.CodResidente + " no existe.");
            if (vivienda.Tex_Tipo == null)
                throw new Exception("Debe ingresar el tipo de vivienda");
            Vivienda existeVivienda = ViviendaDAO.Obtener(vivienda.CodVivienda);
            if (existeVivienda != null)
                throw new Exception("El código " + vivienda.CodVivienda + "ya existe");
            
            //Residente existeResidente = ResidenteDAO.Obtener(codresidente);
            //if (existeResidente == null)
            //    throw new Exception("El código " + vivienda.CodResidente + "no existe");

            return ViviendaDAO.Crear(vivienda);
        }
        public Vivienda ObtenerVivienda(String codvivienda)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ViviendaDAO.Obtener(codvivienda);
        }
        public Vivienda ModificarVivienda(Vivienda vivienda)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ViviendaDAO.Modificar(vivienda);
        }
        public void EliminarVivienda(Vivienda vivienda)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            ViviendaDAO.Eliminar(vivienda);
        }

        public ICollection<Vivienda> ListarTodosLosViviendas()
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return ViviendaDAO.ListarTodosLosViviendas();
        }

        public Cuota_Pago CrearCuota_Pago(Cuota_Pago cuota_pago)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            if (cuota_pago.CodDocumento == null)
                throw new Exception("Debe ingresar el documento de la cuota");
            if (cuota_pago.CodVivienda == null)
                throw new Exception("Debe ingresar el código de vivienda");
            if (cuota_pago.Tex_Periodo == null)
                throw new Exception("Debe ingresar el periodo de la cuota");
            if (cuota_pago.Tex_Estado == null)
                throw new Exception("Debe ingresar el estado de la cuota");
            Cuota_Pago existeCuota_Pago = Cuota_PagoDAO.Obtener(cuota_pago.CodDocumento);
            if (existeCuota_Pago != null)
                throw new Exception("El código " + cuota_pago.CodDocumento + "ya existe");
            ICollection<Cuota_Pago> existePeriodoVivienda = Cuota_PagoDAO.ListarPeriodoVivienda(cuota_pago.Tex_Periodo, cuota_pago.CodVivienda);
            if (existePeriodoVivienda != null)
                throw new Exception("Ya existe una cuota para el periodo " + cuota_pago.Tex_Periodo + " y vivienda " + cuota_pago.CodVivienda + ".");

            return Cuota_PagoDAO.Crear(cuota_pago);
        }
        public Cuota_Pago ObtenerCuota_Pago(String coddocumento)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return Cuota_PagoDAO.Obtener(coddocumento);
        }
        public Cuota_Pago ModificarCuota_Pago(Cuota_Pago cuota_pago)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return Cuota_PagoDAO.Modificar(cuota_pago);
        }
        public void EliminarCuota_Pago(Cuota_Pago cuota_pago)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            Cuota_PagoDAO.Eliminar(cuota_pago);
        }

        public Area_Comun CrearArea_Comun(Area_Comun area_comun)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            if (area_comun.CodAreaComun == null)
                throw new Exception("Debe ingresar el código del area comun");
            if (area_comun.Tex_Tipo == null)
                throw new Exception("Debe ingresar el tipo de area comun");
            if (area_comun.Tex_Estado == null)
                throw new Exception("Debe ingresar el estado del area comun");
            Area_Comun existeArea_Comun = Area_ComunDAO.Obtener(area_comun.CodAreaComun);
            if (existeArea_Comun != null)
                throw new Exception("El código " + area_comun.CodAreaComun + "ya existe");

            return Area_ComunDAO.Crear(area_comun);
        }
        public Area_Comun ObtenerArea_Comun(String codareacomun)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return Area_ComunDAO.Obtener(codareacomun);
        }
        public Area_Comun ModificarArea_Comun(Area_Comun area_comun)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return Area_ComunDAO.Modificar(area_comun);
        }
        public void EliminarArea_Comun(Area_Comun area_comun)
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            Area_ComunDAO.Eliminar(area_comun);
        }

        public ICollection<Area_Comun> ListarTodosLosArea_Comun()
        {
            // Aquí deben ir las validaciones, reglas de negocio, algoritmos, etc.
            return Area_ComunDAO.ListarTodosLosArea_Comun();
        }
    }
}
